Category Theory Applied to Functional Programming